Цель исследования - описать общую картину рынка общественного питания Москвы для инвесторов фонда «Shut Up and Take My Money».
Задачи исследования:
Описание данных:
Для работы над исследованием был предоставлен датасет с заведениями общественного питания Москвы, составленный на основе данных сервисов Яндекс Карты и Яндекс Бизнес на лето 2022 года.
Файл moscow_places.csv:
Ход исследования:
import pandas as pd
import re
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as plotly
from plotly import graph_objects as go
import seaborn as sns
import json
from folium import Map, Choropleth, Marker
from folium.plugins import MarkerCluster
from folium.features import CustomIcon
moscow_places = pd.read_csv('/datasets/moscow_places.csv')
#создание функции для чтение первичной информации для датасетов
def data_full_info(dataset):
print (dataset.info())
print('\033[1m' + 'Количество дубликатов в таблице:' + '\033[0m', dataset.duplicated().sum())
return (dataset.head(10))
data_full_info(moscow_places)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8406 entries, 0 to 8405
Data columns (total 14 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 8406 non-null object
1 category 8406 non-null object
2 address 8406 non-null object
3 district 8406 non-null object
4 hours 7870 non-null object
5 lat 8406 non-null float64
6 lng 8406 non-null float64
7 rating 8406 non-null float64
8 price 3315 non-null object
9 avg_bill 3816 non-null object
10 middle_avg_bill 3149 non-null float64
11 middle_coffee_cup 535 non-null float64
12 chain 8406 non-null int64
13 seats 4795 non-null float64
dtypes: float64(6), int64(1), object(7)
memory usage: 919.5+ KB
None
Количество дубликатов в таблице: 0
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | WoWфли | кафе | Москва, улица Дыбенко, 7/1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.878494 | 37.478860 | 5.0 | NaN | NaN | NaN | NaN | 0 | NaN |
| 1 | Четыре комнаты | ресторан | Москва, улица Дыбенко, 36, корп. 1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.875801 | 37.484479 | 4.5 | выше среднего | Средний счёт:1500–1600 ₽ | 1550.0 | NaN | 0 | 4.0 |
| 2 | Хазри | кафе | Москва, Клязьминская улица, 15 | Северный административный округ | пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... | 55.889146 | 37.525901 | 4.6 | средние | Средний счёт:от 1000 ₽ | 1000.0 | NaN | 0 | 45.0 |
| 3 | Dormouse Coffee Shop | кофейня | Москва, улица Маршала Федоренко, 12 | Северный административный округ | ежедневно, 09:00–22:00 | 55.881608 | 37.488860 | 5.0 | NaN | Цена чашки капучино:155–185 ₽ | NaN | 170.0 | 0 | NaN |
| 4 | Иль Марко | пиццерия | Москва, Правобережная улица, 1Б | Северный административный округ | ежедневно, 10:00–22:00 | 55.881166 | 37.449357 | 5.0 | средние | Средний счёт:400–600 ₽ | 500.0 | NaN | 1 | 148.0 |
| 5 | Sergio Pizza | пиццерия | Москва, Ижорская улица, вл8Б | Северный административный округ | ежедневно, 10:00–23:00 | 55.888010 | 37.509573 | 4.6 | средние | NaN | NaN | NaN | 0 | NaN |
| 6 | Огни города | бар,паб | Москва, Клязьминская улица, 9, стр. 3 | Северный административный округ | пн 15:00–04:00; вт-вс 15:00–05:00 | 55.890752 | 37.524653 | 4.4 | средние | Средний счёт:199 ₽ | 199.0 | NaN | 0 | 45.0 |
| 7 | Mr. Уголёк | быстрое питание | Москва, Клязьминская улица, 9, стр. 3 | Северный административный округ | пн-чт 10:00–22:00; пт,сб 10:00–23:00; вс 10:00... | 55.890636 | 37.524303 | 4.7 | средние | Средний счёт:200–300 ₽ | 250.0 | NaN | 0 | 45.0 |
| 8 | Donna Maria | ресторан | Москва, Дмитровское шоссе, 107, корп. 4 | Северный административный округ | ежедневно, 10:00–22:00 | 55.880045 | 37.539006 | 4.8 | средние | Средний счёт:от 500 ₽ | 500.0 | NaN | 0 | 79.0 |
| 9 | Готика | кафе | Москва, Ангарская улица, 39 | Северный административный округ | ежедневно, 12:00–00:00 | 55.879038 | 37.524487 | 4.3 | средние | Средний счёт:1000–1200 ₽ | 1100.0 | NaN | 0 | 65.0 |
moscow_places['category'].unique()
array(['кафе', 'ресторан', 'кофейня', 'пиццерия', 'бар,паб',
'быстрое питание', 'булочная', 'столовая'], dtype=object)
moscow_places['district'].unique()
array(['Северный административный округ',
'Северо-Восточный административный округ',
'Северо-Западный административный округ',
'Западный административный округ',
'Центральный административный округ',
'Восточный административный округ',
'Юго-Восточный административный округ',
'Южный административный округ',
'Юго-Западный административный округ'], dtype=object)
Датасет содержит в себе ифнормацию о заведениях общественного питания в Москве, а именно: наименование заведения, адрес, район, часы работы, координаты, рейтинг, средний чек, среднюю стоимость чашки кофе, принадлежность к сети и количество посадочных мест. В датасете 8406 записей. После изучения общей информации о датасете видно, что в записях присутствуют пропуски, которые в дальнейшем по возможности необходимо обработать. Явные дубликаты отсутствуют, но необходимо проверить наличие неявных дубликатов. Кроме того, нужно будет отформатировать значения столбцов и типы данных для комфортного дальнейшего анализа.
Проверка явных дубликатов
print('Количество явных дубликатов в датасете:', moscow_places.duplicated().sum())
Количество явных дубликатов в датасете: 0
Изменение значений в столбцах для нахождения неявных дубликатов
moscow_places['name'] = moscow_places['name'].str.lower()
moscow_places['address'] = moscow_places['address'].str.lower()
moscow_places['name'] = moscow_places['name'].str.replace('ё', 'е', regex=True)
Записи в столбцах с названием и адресов заведения приведены к нижнему регистру и заменена буква ё на е.
Проверка дубликатов по названию заведения
print ('Полных дубликатов по названию заведения:',moscow_places.name.duplicated().sum())
Полных дубликатов по названию заведения: 2900
Данные о таких заведения не являются ошибочными. Скорее всего они состоят в сети заведений, следственно имеют одинаковое название.
Проверка неявных дубликатов, где совпадает название и адрес заведения.
print ('Дубликатов по названию и адресу:',moscow_places.duplicated(subset=['name', 'address']).sum())
moscow_places[moscow_places[['name', 'address']].duplicated()]
Дубликатов по названию и адресу: 4
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 215 | кафе | кафе | москва, парк ангарские пруды | Северный административный округ | ежедневно, 10:00–22:00 | 55.881438 | 37.531848 | 3.2 | NaN | NaN | NaN | NaN | 0 | NaN |
| 1511 | more poke | ресторан | москва, волоколамское шоссе, 11, стр. 2 | Северный административный округ | пн-чт 09:00–18:00; пт,сб 09:00–21:00; вс 09:00... | 55.806307 | 37.497566 | 4.2 | NaN | NaN | NaN | NaN | 1 | 188.0 |
| 2420 | раковарня клешни и хвосты | бар,паб | москва, проспект мира, 118 | Северо-Восточный административный округ | пн-чт 12:00–00:00; пт,сб 12:00–01:00; вс 12:00... | 55.810677 | 37.638379 | 4.4 | NaN | NaN | NaN | NaN | 1 | 150.0 |
| 3109 | хлеб да выпечка | кафе | москва, ярцевская улица, 19 | Западный административный округ | NaN | 55.738449 | 37.410937 | 4.1 | NaN | NaN | NaN | NaN | 0 | 276.0 |
Количество таких данных незначительно, их удаление не повлияет на результаты дальнейшего исследование.
Удаление дубликатов
moscow_places = moscow_places.drop_duplicates(subset = ['name', 'address']).reset_index(drop=True)
Заведения с одинаковыми координатами
moscow_places.loc[moscow_places.duplicated(subset=['lat', 'lng'], keep = False)]
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 121 | встреча | кафе | москва, карельский бульвар, 4а | Северный административный округ | ежедневно, круглосуточно | 55.891936 | 37.536068 | 4.1 | NaN | NaN | NaN | NaN | 1 | NaN |
| 182 | карелия | кафе | москва, карельский бульвар, 4а | Северный административный округ | ежедневно, 09:00–00:00 | 55.891936 | 37.536068 | 3.7 | NaN | NaN | NaN | NaN | 0 | NaN |
| 270 | алали | быстрое питание | москва, староватутинский проезд, 14 | Северо-Восточный административный округ | ежедневно, 10:00–22:00 | 55.875804 | 37.665551 | 4.2 | NaN | NaN | NaN | NaN | 0 | 100.0 |
| 272 | pho oanh | кафе | москва, староватутинский проезд, 14 | Северо-Восточный административный округ | ежедневно, 11:00–21:30 | 55.875804 | 37.665551 | 4.0 | NaN | NaN | NaN | NaN | 1 | 100.0 |
| 347 | meat лав | ресторан | москва, головинское шоссе, 10б | Северный административный округ | ежедневно, 11:00–23:00 | 55.837181 | 37.497324 | 5.0 | средние | Средний счёт:300–600 ₽ | 450.0 | NaN | 0 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 7783 | тануки | ресторан | москва, липецкая улица, 2, корп. 8 | Южный административный округ | ежедневно, 10:00–05:00 | 55.608307 | 37.664941 | 4.3 | выше среднего | Средний счёт:1000–1500 ₽ | 1250.0 | NaN | 1 | 120.0 |
| 8015 | пицца кофе | пиццерия | москва, улица вавилова, 66 | Юго-Западный административный округ | ежедневно, 10:00–21:00 | 55.683046 | 37.549310 | 4.2 | NaN | NaN | NaN | NaN | 0 | 80.0 |
| 8082 | кулинарная школа ginza project | кафе | москва, мытная улица, 74 | Южный административный округ | ежедневно, 09:00–21:00 | 55.712117 | 37.620555 | 4.5 | средние | Средний счёт:500–1000 ₽ | 750.0 | NaN | 0 | 92.0 |
| 8091 | белочка | ресторан | москва, улица ленинская слобода, 19 | Южный административный округ | пн-пт 12:00–17:00 | 55.708354 | 37.652705 | 3.4 | NaN | NaN | NaN | NaN | 0 | 450.0 |
| 8397 | суши мания | кафе | москва, профсоюзная улица, 56 | Юго-Западный административный округ | ежедневно, 09:00–02:00 | 55.670021 | 37.552480 | 4.4 | NaN | NaN | NaN | NaN | 0 | 86.0 |
64 rows × 14 columns
Заведений с одинаковыми координатами составляет 64. Скорее всего такие заведения находится в одном здании или торговом центре. Они не являются ошибочными.
Количество пропусков по столбцам заведения
moscow_places.isna().sum()
name 0 category 0 address 0 district 0 hours 535 lat 0 lng 0 rating 0 price 5087 avg_bill 4586 middle_avg_bill 5253 middle_coffee_cup 7867 chain 0 seats 3610 dtype: int64
Пропуски имеются в столбцах: часы работы, средний чек, медиана среднего чека, средняя стоимость чашки кофе и количество посадочных мест.
Пропуски следует заменить только в столбце с часами работы для оптимального дальнейшего исследования.
Остальные пропуски следует оставить, так как предположительно выбранное значение или медианное/среднее значение могут сильно исказить данные и привести к неправильной трактовке.
Обработка пропусков в столце "часы работы"
moscow_places['hours'] = moscow_places['hours'].fillna('неизвестно')
def get_street(address):
return address.split(',')[1]
moscow_places['street'] = moscow_places['address'].apply(get_street)
mp24 = moscow_places[moscow_places['hours'].str.contains('круглосуточно')]
display(mp24)
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | great room bar | бар,паб | москва, левобережная улица, 12 | Северный административный округ | ежедневно, круглосуточно | 55.877832 | 37.469171 | 4.5 | средние | Цена бокала пива:250–350 ₽ | NaN | NaN | 0 | 102.0 | левобережная улица |
| 17 | чайхана беш-бармак | ресторан | москва, ленинградское шоссе, 71б, стр. 2 | Северный административный округ | ежедневно, круглосуточно | 55.876908 | 37.449876 | 4.4 | средние | Средний счёт:350–500 ₽ | 425.0 | NaN | 0 | 96.0 | ленинградское шоссе |
| 19 | пекарня | булочная | москва, ижорский проезд, 5 | Северный административный округ | ежедневно, круглосуточно | 55.887969 | 37.515688 | 4.4 | NaN | NaN | NaN | NaN | 1 | NaN | ижорский проезд |
| 24 | drive café | кафе | москва, улица дыбенко, 9ас1 | Северный административный округ | ежедневно, круглосуточно | 55.879992 | 37.481571 | 4.0 | NaN | NaN | NaN | NaN | 1 | NaN | улица дыбенко |
| 49 | 2u-ту-ю | пиццерия | москва, ижорская улица, 8а | Северный административный округ | ежедневно, круглосуточно | 55.886160 | 37.508784 | 2.7 | NaN | Средний счёт:900 ₽ | 900.0 | NaN | 0 | NaN | ижорская улица |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 8390 | намангале | кафе | москва, ферганская улица, вл17-21 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.705332 | 37.819244 | 4.3 | NaN | NaN | NaN | NaN | 0 | NaN | ферганская улица |
| 8395 | пекарня, кафе-гриль | булочная | москва, болотниковская улица, 52, корп. 2 | Юго-Западный административный округ | ежедневно, круглосуточно | 55.662866 | 37.582572 | 4.2 | NaN | Средний счёт:50–250 ₽ | 150.0 | NaN | 0 | 50.0 | болотниковская улица |
| 8399 | самовар | кафе | москва, люблинская улица, 112а, стр. 1 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.648859 | 37.743219 | 3.9 | NaN | Средний счёт:от 150 ₽ | 150.0 | NaN | 0 | 150.0 | люблинская улица |
| 8400 | чайхана sabr | кафе | москва, люблинская улица, 112а, стр. 1 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.648849 | 37.743222 | 4.2 | NaN | NaN | NaN | NaN | 1 | 150.0 | люблинская улица |
| 8401 | kebab time | кафе | москва, россошанский проезд, 6 | Южный административный округ | ежедневно, круглосуточно | 55.598229 | 37.604702 | 3.9 | NaN | NaN | NaN | NaN | 0 | 12.0 | россошанский проезд |
772 rows × 15 columns
def places_247 (data):
if 'ежедневно, круглосуточно'in data:
return True
else:
return False
moscow_places['is_24_7'] = moscow_places['hours'].apply(places_247)
Проверка датасета на корректность изменений
moscow_places
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24_7 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | wowфли | кафе | москва, улица дыбенко, 7/1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.878494 | 37.478860 | 5.0 | NaN | NaN | NaN | NaN | 0 | NaN | улица дыбенко | False |
| 1 | четыре комнаты | ресторан | москва, улица дыбенко, 36, корп. 1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.875801 | 37.484479 | 4.5 | выше среднего | Средний счёт:1500–1600 ₽ | 1550.0 | NaN | 0 | 4.0 | улица дыбенко | False |
| 2 | хазри | кафе | москва, клязьминская улица, 15 | Северный административный округ | пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... | 55.889146 | 37.525901 | 4.6 | средние | Средний счёт:от 1000 ₽ | 1000.0 | NaN | 0 | 45.0 | клязьминская улица | False |
| 3 | dormouse coffee shop | кофейня | москва, улица маршала федоренко, 12 | Северный административный округ | ежедневно, 09:00–22:00 | 55.881608 | 37.488860 | 5.0 | NaN | Цена чашки капучино:155–185 ₽ | NaN | 170.0 | 0 | NaN | улица маршала федоренко | False |
| 4 | иль марко | пиццерия | москва, правобережная улица, 1б | Северный административный округ | ежедневно, 10:00–22:00 | 55.881166 | 37.449357 | 5.0 | средние | Средний счёт:400–600 ₽ | 500.0 | NaN | 1 | 148.0 | правобережная улица | False |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 8397 | суши мания | кафе | москва, профсоюзная улица, 56 | Юго-Западный административный округ | ежедневно, 09:00–02:00 | 55.670021 | 37.552480 | 4.4 | NaN | NaN | NaN | NaN | 0 | 86.0 | профсоюзная улица | False |
| 8398 | миславнес | кафе | москва, пролетарский проспект, 19, корп. 1 | Южный административный округ | ежедневно, 08:00–22:00 | 55.640875 | 37.656553 | 4.8 | NaN | NaN | NaN | NaN | 0 | 150.0 | пролетарский проспект | False |
| 8399 | самовар | кафе | москва, люблинская улица, 112а, стр. 1 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.648859 | 37.743219 | 3.9 | NaN | Средний счёт:от 150 ₽ | 150.0 | NaN | 0 | 150.0 | люблинская улица | True |
| 8400 | чайхана sabr | кафе | москва, люблинская улица, 112а, стр. 1 | Юго-Восточный административный округ | ежедневно, круглосуточно | 55.648849 | 37.743222 | 4.2 | NaN | NaN | NaN | NaN | 1 | 150.0 | люблинская улица | True |
| 8401 | kebab time | кафе | москва, россошанский проезд, 6 | Южный административный округ | ежедневно, круглосуточно | 55.598229 | 37.604702 | 3.9 | NaN | NaN | NaN | NaN | 0 | 12.0 | россошанский проезд | True |
8402 rows × 16 columns
В ходе проведение преобработки были найдены и удалены неявные дубликаты, заполнены пропуски в столбце с часами работы заведения. Остальные пропуски было решено оставить незаполненными. Также к датасету добавлены столбцы с круглосуточными заведениями и улицей местонахождения заведения.
mp_categories = pd.DataFrame(moscow_places['category'].value_counts()).reset_index()
mp_categories.columns = ['category', 'categories_count']
fig = px.bar(mp_categories,
template='plotly_white',
x='category',
y='categories_count',
text='categories_count',
color='category',
labels=dict(category="Категория")
)
fig.update_layout(title='Количество заведений по категорям',
xaxis_title='Категория',
yaxis_title='Количество заведений')
fig.update_layout(showlegend=False)
fig.show()
В датасете представлены следующие категории заведений:
Самая многочисленная категория заведений - кафе, составляет 28.3% от общего количества заведений (2376 заведений).
На втором месте по количеству - ресторан 24.3% (2042 заведения).
На третьем месте - кофейня 16.8% (1413 заведений).
Далее идут бар/паб, пиццерия, быстрое питание, столовая. И на последнем месте по количеству заведений - булочная 256 заведений - 3.05%
Проверка данных на выбросы
moscow_places['seats'].describe()
count 4792.000000 mean 108.361436 std 122.841130 min 0.000000 25% 40.000000 50% 75.000000 75% 140.000000 max 1288.000000 Name: seats, dtype: float64
fig = px.box(moscow_places,template='plotly_white', y="seats")
fig.show()
В данных о посадочных местах имеются аномально большие значения, которые не следуюет брать во внимание при дальнейшем рассмотрении. Максимальное количесво посадочных мест можно оставить - 400.
Медианное количество посадочных мест по категориям
mp_seats = (
moscow_places.query('seats <= 400')
.groupby('category', as_index=False)
.agg({'seats': 'median'})
.sort_values(by='seats', ascending=False)
)
mp_seats.columns = ['category', 'seats_median']
fig = px.bar(mp_seats,
template='plotly_white',
x='category',
y='seats_median',
text='seats_median',
color='category',
labels=dict(category="Категория")
)
fig.update_layout(title='Медианное количество посадочных мест по категориям',
xaxis_title='Категория',
yaxis_title='Медианное количество посадочных мест')
fig.update_layout(showlegend=False)
fig.show()
Медианное значение посадочных мест (ПМ) после удаления аномальных значений распределились следующим образом на топ 3:
Наименьшее количество - в булочной (около 49 ПМ).
Количество посадочных мест часто находится в прямой зависимости от категории заведения. Так, например, в ресторанах быстрого питания, пиццериях и булочных закономерно меньше посадочных мест, так как клиенты чаще берут еду на вынос или проводят не так много времени, как в ресторах или барах.
Распределение посадочных мест по категориям
fig = px.strip(moscow_places.query('seats <= 400'),
x="category",
y="seats",
color="category",
template='plotly_white',
labels={"category": "Категории заведений"})
fig.update_layout(title='Распределение посадочных мест по категориям',
xaxis_title='Категория',
yaxis_title='Количество посадочных мест')
fig.show()
fig = px.violin(moscow_places.query('seats <= 400'),
y="seats",
x="category",
color="category",
box=True,
template='plotly_white',
labels={"category": "Категории заведений"})
fig.update_layout(title='Распределение посадочных мест по категориям',
xaxis_title='Категория',
yaxis_title='Количество посадочных мест')
fig.show()
По графикам распределения также видно, что в категориях ресторан, кафе, бар/паб и столовая в среднем большее количество посадочных мест.
Изменение значений стобца "сhain"
moscow_places['chain'] = moscow_places['chain'].replace(0, 'несетевые')
moscow_places['chain'] = moscow_places['chain'].replace(1, 'сетевые')
Соотношение сетевых и несетевых заведений
mp_chains = (moscow_places.pivot_table(index='chain',
values='name',
aggfunc='count')
.sort_values(by = 'name', ascending = False)
.reset_index())
mp_chains.columns = ['chain', 'count']
fig = go.Figure(data=[go.Pie(labels=mp_chains['chain'], values=mp_chains['count'])])
fig.update_layout(title='Соотношение "сетевых" и "несетевых" заведений',
width=700,
height=500,
annotations=[dict(x=1.12,
y=1.05,
text='Принадлежность к сети',
showarrow=False)])
fig.show()
Несетевых заведений в датасете больше, чем сетевых.
Процентное соотношение несетевых заведений составляет 61.9% (5199 заведений) на 38.1% сетевых (3203 заведений).
chains_true = moscow_places.query('chain == "сетевые"')
categories_chains = (chains_true.pivot_table(index='category',
values='chain',
aggfunc='count')
.sort_values(by = 'chain', ascending = False)
.reset_index())
categories_chains = mp_categories.merge(categories_chains, how='left', on='category').reset_index(drop=True)
categories_chains['ratio'] = round(categories_chains['chain']/categories_chains['categories_count']*100, 1)
fig = px.bar(categories_chains.sort_values(by='ratio', ascending=False),
template='plotly_white',
x='category',
y='ratio',
text='ratio',
color = 'category'
)
fig.update_layout(title='Соотношение сетевых заведений по категорям',
xaxis_title='Категория',
yaxis_title='Процент сетевых заведений')
fig.update_layout(showlegend=False)
fig.show()
Чаще всего к сетевых заведениям принадлежат булочные, из них только 38.7% являются несетвыми.
На одинаком процентном уровне находятся пиццерии и кофейни, чуть больше половины из которых являются сетевыми.
Наименьшее количество сетевых заведений относятся к категории бар/паб.
Данное распределение можно объяснить взаимосвязью с количеством посадочных мест.
Примечательно, что те заведения, в которых в среднем меньшее количество посадочных мест, чаще принадлежат к сети. Скорее всего такие заведения предпочитаю маленькие по площади филиалы, но распределенные по всему городу.
name_chains_true = (chains_true.pivot_table(index='name', values='chain', aggfunc='count')
.sort_values(by='chain', ascending=False)
.reset_index())
name_chains_true.columns = ['name', 'count']
name_chains_true = name_chains_true.sort_values(by='count', ascending=False).head(15)
fig = px.bar(name_chains_true,
template='plotly_white',
x='name',
y='count',
text='count',
color='name'
)
fig.update_layout(title='Топ-15 сетевых заведений в Москве',
xaxis_title='Наименование заведений',
yaxis_title='Количество')
fig.update_layout(showlegend=False)
fig.show()
В топ-15 популярных сетевых заведений Москвы входят:
Явным фаворитом является "Шоколадница".
В данном топе присутствуют довольно популярные сети заведений, котопые распространены по всей стране. Например: Домино'с пицца, Додо пицца, Яндекс лавка.
Судя по названиям, категориями самых популярных сетей являются: пиццерии, кафе, кофейни.
Стоит более подробно рассмотреть характеристики данных сетей по общей таблице
chains_15_name = name_chains_true['name']
chains_15 = chains_true.query('name in @chains_15_name')
chains_15
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24_7 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 13 | буханка | булочная | москва, базовская улица, 15, корп. 1 | Северный административный округ | ежедневно, 08:00–22:00 | 55.877007 | 37.504980 | 4.8 | NaN | NaN | NaN | NaN | сетевые | 180.0 | базовская улица | False |
| 23 | буханка | булочная | москва, лобненская улица, 13к2 | Северный административный округ | ежедневно, 08:00–22:00 | 55.888421 | 37.527106 | 4.7 | NaN | NaN | NaN | NaN | сетевые | NaN | лобненская улица | False |
| 32 | додо пицца | пиццерия | москва, коровинское шоссе, 23, корп. 1 | Северный административный округ | ежедневно, 09:00–23:00 | 55.877388 | 37.523334 | 4.3 | NaN | Средний счёт:328 ₽ | 328.0 | NaN | сетевые | 46.0 | коровинское шоссе | False |
| 34 | домино'с пицца | пиццерия | москва, клязьминская улица, 11, корп. 4 | Северный административный округ | ежедневно, 10:00–23:00 | 55.886963 | 37.523518 | 4.2 | NaN | Средний счёт:от 500 ₽ | 500.0 | NaN | сетевые | 247.0 | клязьминская улица | False |
| 46 | cofefest | кофейня | москва, улица маршала федоренко, 6с1 | Северный административный округ | пн-пт 09:00–19:00 | 55.879934 | 37.492522 | 3.6 | NaN | NaN | NaN | NaN | сетевые | NaN | улица маршала федоренко | False |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 7969 | теремок | ресторан | москва, ореховый бульвар, 15 | Южный административный округ | ежедневно, 10:00–22:00 | 55.612758 | 37.720272 | 3.7 | NaN | NaN | NaN | NaN | сетевые | 0.0 | ореховый бульвар | False |
| 7970 | хинкальная | ресторан | москва, улица генерала белова, 23а | Южный административный округ | ежедневно, 12:00–00:00 | 55.616224 | 37.719993 | 3.6 | NaN | NaN | NaN | NaN | сетевые | 60.0 | улица генерала белова | False |
| 7975 | яндекс лавка | ресторан | москва, шипиловский проезд, 65, корп. 1 | Южный административный округ | ежедневно, 07:00–00:00 | 55.599020 | 37.714239 | 3.5 | NaN | NaN | NaN | NaN | сетевые | 75.0 | шипиловский проезд | False |
| 7976 | яндекс лавка | ресторан | москва, улица маршала захарова, 2 | Южный административный округ | ежедневно, 07:00–00:00 | 55.624112 | 37.707183 | 4.0 | NaN | NaN | NaN | NaN | сетевые | 200.0 | улица маршала захарова | False |
| 7977 | теремок | ресторан | москва, каширское шоссе, 61г | Южный административный округ | ежедневно, 10:00–22:00 | 55.621939 | 37.713243 | 3.9 | NaN | NaN | NaN | NaN | сетевые | NaN | каширское шоссе | False |
816 rows × 16 columns
chain_desc = chains_15.pivot_table(
index=('category', 'name'),
values=('chain', 'rating', 'seats'),
aggfunc=({'chain':'count',
'rating':'mean',
'seats':'median'})
)
chain_desc.sort_values(by='category')
| chain | rating | seats | ||
|---|---|---|---|---|
| category | name | |||
| бар,паб | му-му | 1 | 4.300000 | 195.0 |
| хинкальная | 3 | 4.333333 | 40.0 | |
| булочная | буханка | 25 | 4.416000 | 50.0 |
| быстрое питание | му-му | 2 | 4.200000 | 300.0 |
| теремок | 2 | 4.450000 | 200.0 | |
| хинкальная | 6 | 4.366667 | 57.0 | |
| чайхана | 2 | 4.300000 | NaN | |
| кафе | шоколадница | 1 | 4.100000 | 230.0 |
| чайхана | 26 | 3.946154 | 50.0 | |
| хинкальная | 19 | 4.352632 | 65.0 | |
| му-му | 12 | 4.216667 | 150.0 | |
| prime | 1 | 4.200000 | 60.0 | |
| буханка | 1 | 4.300000 | NaN | |
| cofefest | 1 | 4.200000 | NaN | |
| кулинарная лавка братьев караваевых | 39 | 4.394872 | 70.0 | |
| кофейня | му-му | 2 | 4.250000 | 120.0 |
| шоколадница | 119 | 4.178151 | 96.0 | |
| кофепорт | 42 | 4.147619 | 85.0 | |
| cofix | 65 | 4.075385 | 87.5 | |
| one price coffee | 71 | 4.064789 | 99.5 | |
| cofefest | 31 | 3.977419 | 60.0 | |
| буханка | 6 | 4.333333 | 40.0 | |
| пиццерия | додо пицца | 74 | 4.286486 | 52.0 |
| домино'с пицца | 76 | 4.169737 | 40.0 | |
| му-му | 1 | 4.300000 | 300.0 | |
| ресторан | prime | 49 | 4.114286 | 97.0 |
| му-му | 8 | 4.262500 | 135.0 | |
| теремок | 36 | 4.105556 | 87.5 | |
| хинкальная | 15 | 4.273333 | 60.0 | |
| чайхана | 9 | 3.777778 | 58.0 | |
| яндекс лавка | 69 | 3.872464 | 46.0 | |
| столовая | му-му | 1 | 4.000000 | 60.0 |
| хинкальная | 1 | 4.200000 | 10.0 |
Основывая на данной таблице, видно, что одни и те же заведения часто попадают в разные категории. Возможно, произошла ошибка при сборе данных, однако, также возможно, что сети иногда позиционируют некоторые свои филиалы как разные категории заведений.
Например, заведений "шоколадница" имеет один филиал-кафе, где имеется большое количество посадочных мест, а также филиал-кофейня, где можно преобрести продукцию или кофе на вынос.
Рейтинг популярных сетевых заведений редко падает ниже 4.0.
Рейтинг первых 3 по пулярности заведений:
mp_districts = moscow_places.pivot_table(index='district',
columns='category',
values='name',
aggfunc='count')
fig = px.bar(mp_districts,
template='plotly_white',
title='Распределение категорий заведений по административным районам',
labels=dict(district="Административый район",
value="Количество заведений",
category="Категория"))
fig.update_layout(width=1000,
height=700)
fig.update_xaxes(categoryorder = 'total descending')
fig.show()
Больше всего заведений сконцентрировано в Центральном административном районе, в следствие того, что это самый популярный и проходимый район для туристов города и других отдыхающий. Самые многочисленные категории заведений - ресторан, кафе, кофейня и бар/паб.
Данные категории также наиболее большие и в других округах.
Количество заведений в Северном, Южном и Северо-восточном округах распределено равномерно.
Самый малочисленный по количеству заведений - Северо-Западный административный округ.
moscow_places['rating'].describe()
count 8402.000000 mean 4.230017 std 0.470320 min 1.000000 25% 4.100000 50% 4.300000 75% 4.400000 max 5.000000 Name: rating, dtype: float64
mp_rating = (moscow_places.pivot_table(index='category',
values='rating',
aggfunc='mean')
.reset_index()
.sort_values(by='rating', ascending=False))
mp_rating.columns = ['category', 'rating']
mpr_round = mp_rating
mpr_round['rating']=round(mpr_round['rating'], 2)
fig = px.bar(mpr_round,
template='plotly_white',
x='category',
y='rating',
text='rating',
color='category',
labels=dict(category="Категория")
)
fig.update_layout(title='Средний рейтинг заведений по категориям',
xaxis_title='Категория',
yaxis_title='Рейтинг')
fig.show()
Самые высокие рейтинги получают бар/паб (показетель близится к 4.4)
Средний рейтинг пиццерий, ресторанов, кафе и булочных держится в районе 4.25-4.3.
Низкие рейтинги у столовых и кафе.
Самый низкий рейтинг у заведений быстрого питание, что может быть связано с тем, что они работают на количество, а не на качество.
district_rating = (moscow_places.groupby('district')
.agg(mean_rating=('rating', 'mean'))
.sort_values(by='mean_rating', ascending=False)
.reset_index())
try:
state_geo = 'https://code.s3.yandex.net/data-analyst/admin_level_geomap.geojson'
except:
state_geo = '/datasets/admin_level_geomap.geojson'
moscow_lat, moscow_lng = 55.751244, 37.618423
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
Choropleth(
geo_data=state_geo,
data=district_rating,
columns=['district', 'mean_rating'],
key_on='feature.name',
fill_color='PuBu',
fill_opacity=0.5,
legend_name='Медианный рейтинг заведений по районам',
).add_to(m)
m
Исходя из фоновой картограммы можно следать вывод, что самые высокие рейтинги у заведений, находящихся в Центральном администативном округе (около 4.33-4.38).
Также, довольно высокие рейтинги у заведений в Северном административном округе (около 4.29).
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
marker_cluster = MarkerCluster().add_to(m)
def create_clusters(row):
Marker(
[row['lat'], row['lng']],
popup=f"{row['name']} {row['rating']}",
).add_to(marker_cluster)
moscow_places.apply(create_clusters, axis=1)
m
Подсчет количества заведений по улицам
street_top_15 = moscow_places.groupby('street').agg({'name' : 'count'}).reset_index()
street_top_15.columns = ['street', 'count']
street_top_15 = street_top_15.sort_values('count', ascending = False).reset_index(drop=True).head(15)
street_top_15
| street | count | |
|---|---|---|
| 0 | проспект мира | 183 |
| 1 | профсоюзная улица | 122 |
| 2 | проспект вернадского | 108 |
| 3 | ленинский проспект | 107 |
| 4 | ленинградский проспект | 95 |
| 5 | дмитровское шоссе | 88 |
| 6 | каширское шоссе | 77 |
| 7 | варшавское шоссе | 76 |
| 8 | ленинградское шоссе | 70 |
| 9 | мкад | 65 |
| 10 | люблинская улица | 60 |
| 11 | улица вавилова | 55 |
| 12 | кутузовский проспект | 54 |
| 13 | улица миклухо-маклая | 49 |
| 14 | пятницкая улица | 48 |
Таблица топ-15 улиц по количеству заведений с разбивкой по категориям
mp_streets = moscow_places.groupby(['street', 'category'])['name'].count().reset_index()
mp_streets.columns = ['street', 'category', 'count']
mp_streets_15 = mp_streets[mp_streets['street'].isin(street_top_15['street'])]
mp_streets_15.head(15)
| street | category | count | |
|---|---|---|---|
| 698 | варшавское шоссе | бар,паб | 6 |
| 699 | варшавское шоссе | быстрое питание | 7 |
| 700 | варшавское шоссе | кафе | 18 |
| 701 | варшавское шоссе | кофейня | 14 |
| 702 | варшавское шоссе | пиццерия | 4 |
| 703 | варшавское шоссе | ресторан | 20 |
| 704 | варшавское шоссе | столовая | 7 |
| 882 | дмитровское шоссе | бар,паб | 6 |
| 883 | дмитровское шоссе | булочная | 2 |
| 884 | дмитровское шоссе | быстрое питание | 10 |
| 885 | дмитровское шоссе | кафе | 23 |
| 886 | дмитровское шоссе | кофейня | 11 |
| 887 | дмитровское шоссе | пиццерия | 8 |
| 888 | дмитровское шоссе | ресторан | 24 |
| 889 | дмитровское шоссе | столовая | 4 |
fig = px.bar(mp_streets_15.sort_values(by='count', ascending=True),
x='count',
y='street',
template='plotly_white',
color='category',
labels=dict(category="Категория")
)
fig.update_layout(title='Топ-15 улиц по количеству заведений',
xaxis_title='Количество заведений',
yaxis_title='Улица',
yaxis={'categoryorder':'total ascending'},
width=1000,
height=600
)
fig.show()
В топ-15 улиц по количеству заведений входят:
Явным лидером является проспект Мира, на котором расположено 183 заведения.
На Профсоюзной улице, проспекте Вернадского и на Ленинском проспекте находятся более 100 заведений (122-108-107)
Самая малочисленная по количеству заведений в топе - улица Пятницкая, на которой можно найти 48 заведений.
one_place = moscow_places.pivot_table(index = 'street', values = 'name', aggfunc = 'count').query("name == 1").reset_index()
op_street = one_place['street']
mp_op_street = moscow_places.query("street in @op_street")
mp_op_street
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24_7 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 15 | дом обеда | столовая | москва, улица бусиновская горка, 2 | Северный административный округ | пн-пт 08:30–18:30; сб 10:00–20:00 | 55.885890 | 37.493264 | 4.1 | средние | Средний счёт:300–500 ₽ | 400.0 | NaN | несетевые | 180.0 | улица бусиновская горка | False |
| 21 | 7/12 | кафе | москва, прибрежный проезд, 7 | Северный административный округ | ежедневно, 10:00–22:00 | 55.876805 | 37.464934 | 4.5 | NaN | NaN | NaN | NaN | несетевые | NaN | прибрежный проезд | False |
| 25 | в парке вкуснее | кофейня | москва, парк левобережный | Северный административный округ | ежедневно, 10:00–21:00 | 55.878453 | 37.460028 | 4.3 | NaN | NaN | NaN | NaN | сетевые | NaN | парк левобережный | False |
| 58 | coffeekaldi's | кофейня | москва, угличская улица, 13, стр. 8 | Северо-Восточный административный округ | ежедневно, 09:00–22:00 | 55.900316 | 37.570558 | 4.1 | средние | Средний счёт:500–800 ₽ | 650.0 | NaN | сетевые | NaN | угличская улица | False |
| 60 | чебуречная история | кофейня | москва, ландшафтный заказник лианозовский | Северо-Восточный административный округ | ежедневно, 10:00–22:00 | 55.899845 | 37.570488 | 4.9 | NaN | NaN | NaN | NaN | сетевые | NaN | ландшафтный заказник лианозовский | False |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 8285 | мираж | ресторан | москва, улица шкулёва, 2а | Юго-Восточный административный округ | пн-пт 11:00–23:00; сб,вс 11:00–00:00 | 55.693340 | 37.746231 | 4.7 | NaN | NaN | NaN | NaN | несетевые | 90.0 | улица шкулёва | False |
| 8290 | wtfcoffee | кофейня | москва, улица артюхиной, 14/8с1 | Юго-Восточный административный округ | ежедневно, 10:00–22:00 | 55.699044 | 37.737790 | 4.4 | средние | NaN | NaN | NaN | несетевые | NaN | улица артюхиной | False |
| 8313 | беседка | кафе | москва, кузьминская улица, 10 | Юго-Восточный административный округ | ежедневно, 11:00–23:00 | 55.690691 | 37.787735 | 4.1 | NaN | NaN | NaN | NaN | сетевые | NaN | кузьминская улица | False |
| 8375 | лагман хаус | кафе | москва, новороссийская улица, 14, стр. 2 | Юго-Восточный административный округ | ежедневно, 10:00–00:00 | 55.678772 | 37.759422 | 4.3 | NaN | NaN | NaN | NaN | сетевые | 40.0 | новороссийская улица | False |
| 8396 | практика кофе | кофейня | москва, чонгарский бульвар, 26а, корп. 1 | Юго-Западный административный округ | пн-пт 08:00–22:00; сб,вс 09:00–22:00 | 55.654289 | 37.600722 | 4.4 | NaN | NaN | NaN | NaN | несетевые | 55.0 | чонгарский бульвар | False |
457 rows × 16 columns
Соотношений заведений по категориям
mp_op_street_pie = pd.DataFrame(mp_op_street['category'].value_counts()).reset_index()
mp_op_street_pie.columns = ['category', 'categories_count']
fig = go.Figure(data=[go.Pie(labels=mp_op_street_pie['category'],
values=mp_op_street_pie['categories_count'],
pull = [0.1, 0])])
fig.update_layout(title='Соотношение заведений по категориям',
width=800,
height=600,
annotations=[dict(x=1.12,
y=1.05,
text='Категории заведений',
showarrow=False)])
fig.show()
Чаще всего, а именно в 34.8% случаев, единственным заведением на улице является кафе.
Далее по частоте идут ресторан (20.4%) и кофейня (18.4%).
Менее, чем в 10 процентах единственным заведением на улице является бар/паб, столовая, быстрое питание.
Меньше 5% у пиццерий и булочных.
Соотношение сетевых и несетевых заведений
mp_one_chains = mp_op_street.pivot_table(index='chain', values='name', aggfunc='count').sort_values(by = 'name', ascending = False).reset_index()
mp_one_chains.columns = ['chain', 'count']
fig = go.Figure(data=[go.Pie(labels=mp_one_chains['chain'], values=mp_one_chains['count'], pull = [0.1, 0])])
fig.update_layout(title='Соотношение "сетевых" и "несетевых" заведений')
fig.show()
В около 80% случев единственное заведение, расположенное на улице, не является сетевым.
print('Процент улиц, на которых находится только один объект общепита, от общего числа улиц, представленных в датасете:', "{0:.2f}%".format(op_street.count() / moscow_places['street'].nunique() * 100, 2))
Процент улиц, на которых находится только один объект общепита, от общего числа улиц, представленных в датасете: 31.58%
mid_avg_bill = moscow_places.groupby('district', as_index=False)['middle_avg_bill'].median()\
.sort_values(by='middle_avg_bill', ascending=False)
print(mid_avg_bill)
moscow_lat, moscow_lng = 55.751244, 37.618423
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
Choropleth(
geo_data=state_geo,
data=mid_avg_bill,
columns=['district', 'middle_avg_bill'],
key_on='feature.name',
fill_color='PuBu',
fill_opacity=0.5,
legend_name='Медианный чек заведений по районам',
).add_to(m)
m
district middle_avg_bill 1 Западный административный округ 1000.0 5 Центральный административный округ 1000.0 4 Северо-Западный административный округ 700.0 2 Северный административный округ 650.0 7 Юго-Западный административный округ 600.0 0 Восточный административный округ 575.0 3 Северо-Восточный административный округ 500.0 8 Южный административный округ 500.0 6 Юго-Восточный административный округ 450.0
Самые высокие средние чеки в заведениях общественного питания Центрально и Западного административных округов (1000 руб.), самый низкий - в Юго-Восточном административном округе (450 руб.). В остальных округах средние чеки составляют от 500 до 700 руб.
Таким образом, удалённость от центра влияет на величину среднего чека не во всех округах Москвы, но в большей степени на западные и северо-западный район.
Разделение рейтинга на подгруппы:
def check_rating(row):
if row ['rating'] <= 3.6:
return 'низкий'
elif 3.7 <= row['rating'] <= 4.4:
return 'средний'
else:
return 'высокий'
moscow_places['check_rating'] = moscow_places.apply(check_rating, axis=1)
moscow_places.head()
| name | category | address | district | hours | lat | lng | rating | price | avg_bill | middle_avg_bill | middle_coffee_cup | chain | seats | street | is_24_7 | check_rating | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | wowфли | кафе | москва, улица дыбенко, 7/1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.878494 | 37.478860 | 5.0 | NaN | NaN | NaN | NaN | несетевые | NaN | улица дыбенко | False | высокий |
| 1 | четыре комнаты | ресторан | москва, улица дыбенко, 36, корп. 1 | Северный административный округ | ежедневно, 10:00–22:00 | 55.875801 | 37.484479 | 4.5 | выше среднего | Средний счёт:1500–1600 ₽ | 1550.0 | NaN | несетевые | 4.0 | улица дыбенко | False | высокий |
| 2 | хазри | кафе | москва, клязьминская улица, 15 | Северный административный округ | пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... | 55.889146 | 37.525901 | 4.6 | средние | Средний счёт:от 1000 ₽ | 1000.0 | NaN | несетевые | 45.0 | клязьминская улица | False | высокий |
| 3 | dormouse coffee shop | кофейня | москва, улица маршала федоренко, 12 | Северный административный округ | ежедневно, 09:00–22:00 | 55.881608 | 37.488860 | 5.0 | NaN | Цена чашки капучино:155–185 ₽ | NaN | 170.0 | несетевые | NaN | улица маршала федоренко | False | высокий |
| 4 | иль марко | пиццерия | москва, правобережная улица, 1б | Северный административный округ | ежедневно, 10:00–22:00 | 55.881166 | 37.449357 | 5.0 | средние | Средний счёт:400–600 ₽ | 500.0 | NaN | сетевые | 148.0 | правобережная улица | False | высокий |
Количество заведений по группам рейтинга
moscow_places.groupby('check_rating')['check_rating'].count().sort_values(ascending=False)
check_rating средний 5773 высокий 2048 низкий 581 Name: check_rating, dtype: int64
Больше представленных в датасете заведений имеют средний рейтинг - 5773 заведения, что составляет больше половины от общего количества.
Средний чек по рейтингу
avg_bill_rating = moscow_places.groupby(['category', 'check_rating'])['middle_avg_bill'].mean().reset_index()
avg_bill_rating['middle_avg_bill'] = round(avg_bill_rating['middle_avg_bill'], 2)
avg_bill_rating
| category | check_rating | middle_avg_bill | |
|---|---|---|---|
| 0 | бар,паб | высокий | 1498.25 |
| 1 | бар,паб | низкий | 438.33 |
| 2 | бар,паб | средний | 1271.06 |
| 3 | булочная | высокий | 657.00 |
| 4 | булочная | низкий | 558.33 |
| 5 | булочная | средний | 665.67 |
| 6 | быстрое питание | высокий | 473.72 |
| 7 | быстрое питание | низкий | 339.14 |
| 8 | быстрое питание | средний | 457.89 |
| 9 | кафе | высокий | 918.46 |
| 10 | кафе | низкий | 716.12 |
| 11 | кафе | средний | 660.29 |
| 12 | кофейня | высокий | 616.07 |
| 13 | кофейня | низкий | 425.00 |
| 14 | кофейня | средний | 618.60 |
| 15 | пиццерия | высокий | 1050.43 |
| 16 | пиццерия | низкий | 793.33 |
| 17 | пиццерия | средний | 724.88 |
| 18 | ресторан | высокий | 1751.36 |
| 19 | ресторан | низкий | 955.56 |
| 20 | ресторан | средний | 1198.17 |
| 21 | столовая | высокий | 299.97 |
| 22 | столовая | низкий | 325.71 |
| 23 | столовая | средний | 345.39 |
fig = px.histogram(avg_bill_rating,
x="category",
y="middle_avg_bill",
color='check_rating',
barmode='group',
template='plotly_white',
title='Распеделение среднего чека по рейтингу и категории заведения',
labels=dict(category="Категория",
value="Средний чек",
check_rating="Рейтинг"))
fig.update_layout(width=1000,
height=700)
fig.update_xaxes(categoryorder = 'total descending')
fig.show()
Исходя из графика видно что, высокий рейтинг заведения, в частности ресторанов, бар\пабов и пиццерий, пропорционален крупному среднему чеку.
Примечательно, что в некоторых случаях, заведения получают низкий рейтинг при достаточно высоком среднем чеке (н-р кафе или булочных).
Столовые не показывают сильной взаимосвязи.
Зависимость между средним рейтингом и чеком
fig = px.box(moscow_places, template='plotly_white', y="middle_avg_bill")
fig.show()
В данных о среднем чеке имеются аномально большие значение, которые необходимо исключить.
Крайний показатель следует оставить - 7250.
fig = px.scatter(moscow_places.query('middle_avg_bill <=7250'),
x="rating",
y="middle_avg_bill",
color="check_rating",
template='plotly_white',
title='Зависимость среднего чека от рейтинга заведения',
labels=dict(rating="Рейтинг",
middle_avg_bill="Средний чек",
check_rating="Рейтинг"))
fig.show()
По диаграмме рассеяния можно утверждать, что яркой взаимосвязи между средним чеком и рейнтигом не прослеживается. Заведения имеют высокий рейтинг даже при относитьльно всх данных низком среднем чеке (около 1000р.)
В Москве самой многочисленной категорией заведений являются кафе(2376 - 28.3%), рестораны (2042 - 24.3%) и кофейни (1413 - 16.8%). Меньше всего в Москве булочных и столовых.
Количество посадочных мест варьируется от 40 до 1288, в среднем в самых распространенных категориях заведений количество посадочных мест составляет около 80.
К сети принадлежат около 38% заведений, среди которых чаще всего булочные (61.3% от общего числа булочных), пиццерии (52.1%) и кофейни (51%).
Самое популярное заведение Москвы - "Шоколадница", которая также принадлежит к сети заведений и имеет довольно высокие рейтинги.
Больше всего заведений в целом и заведений с высоким рейтингом и средним чеком сконцентрированы в Центральном административном округе города.
Проспект Мира - улица с наибольшим количеством заведений.
Средний чек чаще всего не имеет прямой зависимости от рейтинга заведения.
Создание датасета только с кофейнями
coffee_houses = moscow_places.query('category == "кофейня"')
Количество кофеен
print('Общее количество кофеен в датасете:', coffee_houses['name'].count())
Общее количество кофеен в датасете: 1413
Количество уникальных кофеен
print('Количество уникальных названий кофеен в даатсете:', coffee_houses['name'].nunique())
Количество уникальных названий кофеен в даатсете: 825
Распределение кофеен по административным округам
ch_district = coffee_houses.groupby('district')['name'].count().reset_index()
ch_district.sort_values(by='name', ascending=False).reset_index(drop=True)
fig = px.bar(ch_district.sort_values(by='name', ascending=False),
template='plotly_white',
x='district',
y='name',
text='name',
color = 'district',
)
fig.update_layout(title='Распределение кофеен по административным округам',
xaxis_title='Административный округ',
yaxis_title='Число заведений')
fig.update_layout(showlegend=False)
fig.show()
Большинство кофеен, а именно 162 - 30.3%, расположены в Центральном административном округе, что также является следствием самой большой наполненностью данного района заведениями.
Меньше всего кофеен можно встретить в Юго-западном административном округе.
Расположение кофеен на фоновой картограмме
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
marker_cluster = MarkerCluster().add_to(m)
def create_clusters(row):
Marker(
[row['lat'], row['lng']],
popup=f"{row['name']} {row['rating']}",
).add_to(marker_cluster)
coffee_houses.apply(create_clusters, axis=1)
m
Количество круглосуточных кофеен
print('Количество круглосуточных кофеен в датасете:', coffee_houses.query('is_24_7 == True')['name'].count())
Количество круглосуточных кофеен в датасете: 59
Создание отдельного датафрейма только с круглосуточными кофейнями
ch_247 = coffee_houses.query('is_24_7 == True')
Отображение крулосуточных кофеен на карте
ch_247_district = ch_247.groupby('district')['name'].count().reset_index()
ch_247_district.sort_values(by='name', ascending=False).reset_index(drop=True)
fig = px.bar(ch_247_district.sort_values(by='name', ascending=False),
template='plotly_white',
x='district',
y='name',
text='name',
color = 'district',
)
fig.update_layout(title='Распределение кргулосуточных кофеен по округам',
xaxis_title='Административный округ',
yaxis_title='Число заведений')
fig.update_layout(showlegend=False)
fig.show()
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
marker_cluster = MarkerCluster().add_to(m)
def create_clusters(row):
Marker(
[row['lat'], row['lng']],
popup=f"{row['name']} {row['rating']}",
).add_to(marker_cluster)
ch_247.apply(create_clusters, axis=1)
m
Большинство круглосуточных кофеен, как и остальных заведений, расположено в Центральном административном округе и составляет 44.1%.
Минимальное количество - 1 круглосуточная кофейня - расположено в Южном и Юго-восточном административном округах.
Количество уникальных названий круглосуточных кофеен
nun_coffee_houses = coffee_houses.query('is_24_7 == True')['name'].nunique()
print('Количество уникальных названий круглосуточных кофеен:', nun_coffee_houses)
Количество уникальных названий круглосуточных кофеен: 22
Процент уникальных названий кофеен от общего числа круглосуточных кофеен
print('Процент уникальных названий кофеен от общего числа круглосуточных кофеен:', "{0:.2f}%".format(nun_coffee_houses / coffee_houses['name'].nunique() * 100))
Процент уникальных названий кофеен от общего числа круглосуточных кофеен: 2.67%
Средний рейтинг кофеен
print('Средний рейтинг кофеен:', round(coffee_houses['rating'].mean(), 2))
Средний рейтинг кофеен: 4.28
Распределение рейтинга по районам
ch_rating = (coffee_houses.groupby('district')
.agg(mean_rating=('rating', 'mean'))
.sort_values(by='mean_rating', ascending=False)
.reset_index())
moscow_lat, moscow_lng = 55.751244, 37.618423
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
Choropleth(
geo_data=state_geo,
data=ch_rating,
columns=['district', 'mean_rating'],
key_on='feature.name',
fill_color='PuBu',
fill_opacity=0.5,
legend_name='Медианный рейтинг кофеен по районам',
).add_to(m)
m
Кофейни с высоким средним рейтингом более 4.3 сконцентрированы Центральном и Северо-западном административном округах.
Средний рейтинг 4.2 у кофеен Западного административного окурга является самым низким.
coffee_houses['middle_coffee_cup'].describe()
count 521.000000 mean 175.055662 std 89.753009 min 60.000000 25% 124.000000 50% 170.000000 75% 225.000000 max 1568.000000 Name: middle_coffee_cup, dtype: float64
Распределение средней стоимости чашки кофе
fig = px.violin(coffee_houses,
y="middle_coffee_cup",
box=True,
points='all',
template='plotly_white'
)
fig.show()
Медианная стоимость чашки кофе - 170р.
Стоит убрать аномально высокое значение.
coffee_houses = coffee_houses.query('middle_coffee_cup <= 400')
print('Медианное значение средней стоимости чашки кофе:', round(coffee_houses['middle_coffee_cup'].median(), 2))
print('Среднее значение средней стоимости чашки кофе:', round(coffee_houses['middle_coffee_cup'].mean(), 2))
Медианное значение средней стоимости чашки кофе: 169.5 Среднее значение средней стоимости чашки кофе: 172.38
fig = px.violin(coffee_houses,
y="middle_coffee_cup",
x="district",
color="category",
box=True,
labels={"category": "Категория"})
fig.update_layout(title='Распределение медианного значения стоимости кофе по округам',
xaxis_title='Округ',
yaxis_title='Средняя стоимость чашки кофе')
fig.show()
Самое высокое медианное значение стоимости чашки кофе в Юго-западном административном округе - 198р.
Самое низкое - в Восточном административном округе - 135р.
ch_mean_cup = coffee_houses.pivot_table(index='district', values='middle_coffee_cup', aggfunc='mean').sort_values(by = 'middle_coffee_cup', ascending = False).reset_index()
ch_mean_cup.columns = ['district', 'mean_coffee_cup']
ch_mc_round = ch_mean_cup
ch_mc_round['mean_coffee_cup'] = round(ch_mc_round['mean_coffee_cup'])
fig = px.bar(ch_mean_cup,
template='plotly_white',
x='district',
y='mean_coffee_cup',
text='mean_coffee_cup',
color='district'
)
fig.update_layout(title='Среднее значение чашки кофе по округам ',
xaxis_title='Округ',
yaxis_title='Стоимость чашки кофе')
fig.update_layout(showlegend=False)
fig.show()
moscow_lat, moscow_lng = 55.751244, 37.618423
m = Map(location=[moscow_lat, moscow_lng], zoom_start=10)
Choropleth(
geo_data=state_geo,
data=ch_mean_cup,
columns=['district', 'mean_coffee_cup'],
key_on='feature.name',
fill_color='PuBu',
fill_opacity=0.5,
legend_name='Средняя стоимость чашки кофе по районам',
).add_to(m)
m
После изучения среднего значения стоимость чашки по сравнению с медианным видно, что цена в Западном и Центральном административном округах распределена нормально, но достаточно высока.
В Восточном административном округе наблюдалось самое высокое медианное значение, но среднее - самое низкое, что может означать нестабильное и неравномерное распределение цен по району.
В Москве расположены 1413 кофеен по всему городу. Большинство из них находятся в Центральном административном округе.
Круглосуточных кофеен в Москве насчитывается 59 заведений.
Средний рейтинг кофеен достаточно высокий - 4.28. Наиболее высокий рейтинг у кафе в Центральном и Северо-Западном административных округах. Средние рейтинги в Юго-западном, Северном и Восточном административным округах.
Средняя стоимость чашки кофе - 172р. В Западном, Центральном и Юго-западном административных округах самые высокие показатели цен.
Краткие рекомандационные характеристики для открытия новой кофейни:
Особенности рекомендаций для районов:
В ходе проведения исследования рынка заведений общественного питания в Москве было выполнено:
Презентация: https://disk.yandex.ru/i/Rd_aHLlHD1lkJQ